if ( hypercall_pfn >= nr_pages )
goto error_out;
op.u.hypercall_init.domain = (domid_t)dom;
- op.u.hypercall_init.mfn = page_array[hypercall_pfn];
+ op.u.hypercall_init.gmfn = shadow_mode_enabled ?
+ hypercall_pfn : page_array[hypercall_pfn];
op.cmd = DOM0_HYPERCALL_INIT;
if ( xc_dom0_op(xc_handle, &op) )
goto error_out;
case DOM0_HYPERCALL_INIT:
{
- struct domain *d;
- unsigned long mfn = op->u.hypercall_init.mfn;
+ struct domain *d = find_domain_by_id(op->u.hypercall_init.domain);
+ unsigned long gmfn = op->u.hypercall_init.gmfn;
+ unsigned long mfn;
void *hypercall_page;
ret = -ESRCH;
- if ( unlikely((d = find_domain_by_id(
- op->u.hypercall_init.domain)) == NULL) )
+ if ( unlikely(d == NULL) )
break;
+ mfn = gmfn_to_mfn(d, gmfn);
+
ret = -EACCES;
if ( !mfn_valid(mfn) ||
!get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
#define DOM0_HYPERCALL_INIT 48
struct dom0_hypercall_init {
- domid_t domain; /* domain to be affected */
- xen_pfn_t mfn; /* machine frame to be initialised */
+ domid_t domain; /* domain to be affected */
+ xen_pfn_t gmfn; /* GMFN to be initialised */
};
typedef struct dom0_hypercall_init dom0_hypercall_init_t;
DEFINE_XEN_GUEST_HANDLE(dom0_hypercall_init_t);